home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d12 / v8n21.arc / MPMUL2.ASM < prev    next >
Assembly Source File  |  1989-11-11  |  4KB  |  99 lines

  1.         title   MPMUL2.ASM Multiple-Precision Unsigned Multiply
  2.         page    55,132
  3.  
  4. ; MPMUL2.ASM    Multiple-Precision Unsigned Multiply
  5. ;               for Intel 8086, 8088, 80286, and
  6. ;               80386 in real mode/16-bit protected mode.
  7. ;               This version uses "shift and add" method.
  8. ;
  9. ; Copyright (c) 1989 Ziff Davis Communications
  10. ; PC Magazine * Ray Duncan
  11. ;
  12. ; Call with:    DS:SI   = address of source operand
  13. ;               ES:DI   = address of destination operand
  14. ;               CX      = operand length in bytes
  15. ;
  16. ;               Assumes direction flag is clear at entry
  17. ;               Assumes DS = ES <> SS
  18. ;               Assumes 0 < CX <= 255
  19. ;
  20. ; Returns:      ES:DI   = address of product
  21. ;
  22. ;               NOTE: Buffer for destination operand must be
  23. ;               twice as long as the actual operand, because
  24. ;               it will receive a double-precision result.
  25. ;
  26. ; Destroys:     AX (other registers preserved)
  27. ;
  28. _TEXT    segment word public 'CODE'
  29.  
  30.          assume  cs:_TEXT
  31.  
  32.          public  mpmul2
  33. mpmul2   proc    near
  34.  
  35.          push    bx                      ; save registers        
  36.          push    cx
  37.          push    dx
  38.          push    bp
  39.  
  40.          push    di                      ; save addr of dest argument
  41.          mov     dx,cx                   ; save bytes/operand
  42.  
  43.          add     di,cx                   ; find address of high half
  44.          mov     bp,di                   ; of product, save it in BP
  45.  
  46.          xor     al,al                   ; initialize high half of
  47.          rep     stosb                   ; forming product to zero
  48.  
  49.          pop     di                      ; retrieve addr of dest arg
  50.  
  51.          mov     cx,dx                   ; CX = bits per argument + 1
  52.          shl     cx,1
  53.          shl     cx,1
  54.          shl     cx,1
  55.          inc     cx
  56.  
  57.          clc                             ; initialize carry
  58.  
  59. mpmul21: pushf                           ; save carry flag
  60.          mov     bx,dx                   ; BX = bytes in product - 1
  61.          shl     bx,1
  62.          dec     bx
  63.          popf                            ; restore carry flag
  64.  
  65. mpmul22: rcr     byte ptr es:[di+bx],1   ; shift forming product and 
  66.          dec     bx                      ; dest operand right 1 bit
  67.          jns     mpmul22                 ; loop while BX >= 0
  68.  
  69.          jnc     mpmul24                 ; jump if bit shifted out = 0
  70.  
  71.                                          ; bit shifted out = 1
  72.          xchg    bp,di                   ; DI = high half of product
  73.          push    cx                      ; save bit counter
  74.          mov     cx,dx                   ; CX = bytes per argument
  75.          xor     bx,bx                   ; init index (also clears carry)
  76.                                         
  77. mpmul23: mov     al,[si+bx]              ; add source argument to high
  78.          adc     es:[di+bx],al           ; half of forming product
  79.          inc     bx                      
  80.          loop    mpmul23
  81.  
  82.          pop     cx                      ; restore bit counter
  83.          xchg    bp,di                   ; restore dest operand pointer
  84.  
  85. mpmul24: loop    mpmul21                 ; loop until all bits processed
  86.  
  87.          pop     bp                      ; restore registers
  88.          pop     dx
  89.          pop     cx
  90.          pop     bx
  91.          ret                             ; back to caller
  92.  
  93. mpmul2   endp
  94.  
  95. _TEXT    ends
  96.  
  97.          end
  98.  
  99.